home *** CD-ROM | disk | FTP | other *** search
/ Multimedia Toolkit / Multimedia Toolkit.iso / pascal / cmdline.pas < prev    next >
Pascal/Delphi Source File  |  1993-03-21  |  6KB  |  224 lines

  1. {****************************************************************************}
  2. {                                                                            }
  3. { MODULE:         CmdLine                                                    }
  4. {                                                                            }
  5. { DESCRIPTION:    This module implements a workframe for a command line      }
  6. {                 options interpreter. You just have to make a desdendant    }
  7. {                 object overriding the InterpretNoSwitch and                }
  8. {                 InterpretSwitch methods.                                   }
  9. {                                                                            }
  10. {                 Also, the GetDOSCmdLine function is provided. It returns   }
  11. {                 the command line written from the DOS prompt.              }
  12. {                                                                            }
  13. { AUTHOR:         Juan Carlos Arévalo                                        }
  14. {                                                                            }
  15. { MODIFICATIONS:  Nobody (yet ;-)                                            }
  16. {                                                                            }
  17. { HISTORY:        14-Mar-1993 Design and implementation.                     }
  18. {                                                                            }
  19. { (C) 1993 VangeliSTeam                                                      }
  20. {____________________________________________________________________________}
  21.  
  22. UNIT CmdLine;
  23.  
  24. INTERFACE
  25.  
  26. USES Dos, Objects;
  27.  
  28.  
  29.  
  30.  
  31. TYPE
  32.   TSwitch = STRING[4];
  33.  
  34.   PCmdLine = ^TCmdLine;
  35.   TCmdLine = STRING[127];
  36.  
  37.   PCmdLineInterpreter = ^TCmdLineInterpreter;
  38.   TCmdLineInterpreter =
  39.     OBJECT(TObject)
  40.       Line     : STRING;
  41.       FileDir  : DirStr;
  42.       Idx      : WORD;
  43.       Aborting : BOOLEAN;
  44.  
  45.       PROCEDURE ParseLine (s: STRING);                                       VIRTUAL;
  46.       PROCEDURE ParseFile (FName: PathStr);                                  VIRTUAL;
  47.       FUNCTION  GetToken                                         : TCmdLine; VIRTUAL;
  48.       FUNCTION  CmpSwitch (VAR Token: TCmdLine; Switch: TSwitch) : BOOLEAN;  VIRTUAL;
  49.       FUNCTION  TokenParam(VAR Token: TCmdLine)                  : TCmdLine; VIRTUAL;
  50.       PROCEDURE Abort;                                                       VIRTUAL;
  51.  
  52.       PROCEDURE InterpretNoSwitch(Token: TCmdLine); VIRTUAL;
  53.       PROCEDURE InterpretSwitch  (Token: TCmdLine); VIRTUAL;
  54.     END;
  55.  
  56.  
  57.  
  58.  
  59. FUNCTION GetDOSCmdLine : TCmdLine;
  60.  
  61.  
  62.  
  63.  
  64. IMPLEMENTATION
  65.  
  66.  
  67.  
  68.  
  69. PROCEDURE TCmdLineInterpreter.ParseLine(s: STRING);
  70.   VAR
  71.     Token    : TCmdLine;
  72.     SaveLine : STRING;
  73.     SaveIdx  : WORD;
  74.     i        : WORD;
  75.   BEGIN
  76.     i := Pos(';', s);
  77.     IF i > 0 THEN
  78.       s := Copy(s, 1, i-1);
  79.  
  80.     Line     := s;
  81.     Idx      := 1;
  82.     Aborting := FALSE;
  83.  
  84.     Token := GetToken;
  85.     IF Token = '' THEN
  86.       Token := GetToken;
  87.  
  88.     WHILE Token <> '' DO
  89.       BEGIN
  90.         IF Aborting THEN EXIT;
  91.  
  92.         IF      (Token[1] = '/') OR
  93.                 (Token[1] = '-') THEN
  94.           InterpretSwitch(Copy(Token, 2, 255))
  95.         ELSE IF (Token[1] = '@') THEN
  96.           BEGIN
  97.             SaveLine := Line;
  98.             SaveIdx  := Idx;
  99.  
  100.             ParseFile(Copy(Token, 2, 255));
  101.  
  102.             Line := SaveLine;
  103.             Idx  := SaveIdx;
  104.           END
  105.         ELSE
  106.           InterpretNoSwitch(Token);
  107.  
  108.         Token := GetToken;
  109.       END;
  110.   END;
  111.  
  112.  
  113. PROCEDURE TCmdLineInterpreter.ParseFile(FName: PathStr);
  114.   VAR
  115.     f    : TEXT;
  116.     Name : NameStr;
  117.     Ext  : ExtStr;
  118.   BEGIN
  119.     Aborting := FALSE;
  120.  
  121.     FSplit(FExpand(FName), FileDir, Name, Ext);
  122.  
  123.     Assign(f, FName);
  124.     Reset(f);
  125.     IF IOResult <> 0 THEN EXIT;
  126.  
  127.     WHILE NOT EoF(f) DO
  128.       BEGIN
  129.         IF Aborting THEN EXIT;
  130.  
  131.         ReadLn(f, Line);
  132.         IF IOResult <> 0 THEN
  133.           BEGIN
  134.             Close(f);
  135.             IF IOResult <> 0 THEN;
  136.             EXIT;
  137.           END;
  138.         ParseLine(Line);
  139.       END;
  140.  
  141.     Close(f);
  142.     IF IOResult <> 0 THEN;
  143.   END;
  144.  
  145.  
  146. FUNCTION TCmdLineInterpreter.GetToken : TCmdLine;
  147.   CONST
  148.     Spaces = [#0, #9, ' ', ','];
  149.   VAR
  150.     i : WORD;
  151.   BEGIN
  152.     GetToken[0] := #0;
  153.     FOR i := Idx TO Length(Line) DO
  154.       BEGIN
  155.         IF Line[i] IN Spaces THEN
  156.           BEGIN
  157.             WHILE (i <= Length(Line)) AND (Line[i] IN Spaces) DO
  158.               INC(i);
  159.  
  160.             Idx := i;
  161.             EXIT;
  162.           END;
  163.  
  164.         GetToken[i - Idx + 1] := Line[i];
  165.         GetToken[0]           := CHAR(i - Idx + 1);
  166.       END;
  167.     Idx := 255;
  168.   END;
  169.  
  170.  
  171. FUNCTION TCmdLineInterpreter.CmpSwitch(VAR Token: TCmdLine; Switch: TSwitch) : BOOLEAN;
  172.   VAR
  173.     i : WORD;
  174.   BEGIN
  175.     CmpSwitch := FALSE;
  176.     FOR i := 1 TO Length(Switch) DO
  177.       IF UpCase(Switch[i]) <> UpCase(Token[i]) THEN
  178.         EXIT;
  179.  
  180.     CmpSwitch := TRUE;
  181.     Token     := Copy(Token, Length(Switch) + 1, 255);
  182.  
  183.     IF Token[1] = ':' THEN
  184.       Token   := Copy(Token, 2, 255);
  185.   END;
  186.  
  187.  
  188. FUNCTION TCmdLineInterpreter.TokenParam(VAR Token: TCmdLine) : TCmdLine;
  189.   BEGIN
  190.     IF Token = '' THEN
  191.       Token := GetToken;
  192.  
  193.     TokenParam := Token;
  194.   END;
  195.  
  196.  
  197. PROCEDURE TCmdLineInterpreter.Abort;
  198.   BEGIN
  199.     Aborting := TRUE;
  200.   END;
  201.  
  202.  
  203. PROCEDURE TCmdLineInterpreter.InterpretNoSwitch(Token: TCmdLine);
  204.   BEGIN
  205.   END;
  206.  
  207.  
  208. PROCEDURE TCmdLineInterpreter.InterpretSwitch(Token: TCmdLine);
  209.   BEGIN
  210.   END;
  211.  
  212.  
  213.  
  214.  
  215. FUNCTION GetDOSCmdLine : TCmdLine;
  216.   BEGIN
  217.     GetDOSCmdLine := PCmdLine(Ptr(PrefixSeg, $80))^;
  218.   END;
  219.  
  220.  
  221.  
  222.  
  223. END.
  224.